import time
from threading import Thread


# 把1 累计n次的求和的密集型函数
def add(n):
    sum = 0
    while sum < n:
        sum += 1
    print(f'当前线程加了{sum}次')


if __name__ == '__main__':
    # 比较 单线程和多线程计算时间。
    start = time.time()

    n = 1000000000
    # 两个线程计算 共计算 1000000000 次 计算总共花费时间19.939798593521118
    p1 = Thread(target=add, args=(n/2, ) )
    p2 = Thread(target=add, args=(n/2, ) )
    # p1.daemon = True
    p1.start()
    p2.start()
    p1.join() # 阻塞等待p1执行完
    p2.join() # 阻塞等待p2执行完

    # 单个个线程计算 共计算 1000000000 次 计算总共花费时间14.505724906921387
    # add(n)

    end = time.time()
    print(f'计算总共花费时间{end - start}')

    # 总结：
    # 计算密集型任务，两个线程计算10亿次累加花费时间19.9秒，单个线程计算10亿次累计花费时间14.5秒
    # 此时多线程操作计算密集型的任务，由于线程之间抢占GIL锁，释放GIL锁，切换cpu使用片段，进行计算，花费时间更多
    # 单线程计算 10亿次 累加 花费时间 14.5秒，反而更快。单线程计算不需要抢占或者释放GIL锁。切换CPU